
package ec.edu.ups.cidi.siia.plamdep.algoritmos;

import com.google.common.collect.Sets;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import ec.edu.ups.cidi.siia.plamdep.modelo.algortimos.*;
import ec.edu.ups.cidi.siia.plamdep.modelo.analizadorLexico.*;

public class VectorSpaceModel extends AlgoritmoComparacion{

 HashMap<String,Double>  mapa;
 ResultAnalisisFinal rf=new ResultAnalisisFinal();
 List<NGrama> ngrama;
 List<Palabra> palabrasO=new ArrayList<Palabra>();
 List<Palabra>  palabrasS = new  ArrayList<Palabra>();
 List<Parrafo> parrafos = new ArrayList<Parrafo>();
 List<Parrafo> parrafosS = new ArrayList<Parrafo>();

          

  
  public String ejecutar() {
	 
	 System.out.println("textosospechoso:   "+textoSospechoso);
	 parrafosS= analizador.getParrafos(textoSospechoso);
     parrafos = analizador.getParrafos(this.fuente.getContenido());
       
    for(Parrafo po: parrafos){
    	
    	for(Palabra pal:po.getPalabras())
    	palabrasO.add( pal);
    }
        	
        for(Parrafo po: parrafosS) {
        	for(Palabra pal:po.getPalabras())
         	palabrasS.add( pal);
        }

          //eliminar stopwords
         // palabrasO = analizador.eliminarStopWords(palabrasO);
        //  palabrasS = analizador.eliminarStopWords(palabrasS);
          
        double plagio=cosine_similarity(contarPalabras(palabrasO),contarPalabras(palabrasS));
        rf.setPlagioDocPorcentaje(plagio*100);
                      
        return "";

  }        

  

    
    public ResultAnalisisFinal getResultadoFinal() 
    {
        return  rf;
    }

     public   double cosine_similarity(Map<String, Double> v1, Map<String, Double> v2) {

            Set<String> both = Sets.newHashSet(v1.keySet());     
            
            both.retainAll(v2.keySet());
            System.out.println(v2.keySet());
            System.out.println(v1.keySet());

            double sclar = 0, norm1 = 0, norm2 = 0;

            for (String k : both) {
            							sclar += v1.get(k) * v2.get(k);
            							System.out.println(k+" ==)  "+sclar);	
            						}
            for (String k : v1.keySet()) norm1 += v1.get(k) * v1.get(k);
            for (String k : v2.keySet()) norm2 += v2.get(k) * v2.get(k);

            System.out.println(sclar+"/sqrt("+norm1 +"*"+ norm2+")");
            System.out.println(sclar+"/"+Math.sqrt(norm1 * norm2));
            
            return sclar / Math.sqrt(norm1 * norm2);

    }
     public Map<String, Double> contarPalabras(List<Palabra> palabras){
      mapa =  new HashMap< String, Double>();
      for(int i = 0 ; i<palabras.size(); i++)
      {
    	    String palabra = palabras.get(i).getPalabra().toLowerCase(); // obtiene una palabra
            if ( mapa.containsKey( palabra ) ) 
            {
               Double cuenta = mapa.get( palabra ); // obtiene la cuenta actual
               mapa.put( palabra, cuenta + 1 ); // incrementa la cuenta
            } // fin de if
            else
            mapa.put( palabra, 1.0 ); // agrega una nueva palabra con una cuenta de 1 al mapa
      } // fin de while
       return mapa;
     }

    }
